package com.monitor.ui.controller;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.input.MouseEvent;

import java.net.URL;
import java.util.ResourceBundle;
import java.util.ArrayList;
import java.util.List;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 控制面板控制器
 * 负责时间控制和代理阻断功能的实现
 */
public class ControlPanelController implements Initializable {

    // 时间控制相关组件
    @FXML private TextArea timeControlDescription;
    @FXML private RadioButton timeControlEnabledBtn;
    @FXML private RadioButton timeControlDisabledBtn;
    @FXML private ToggleGroup timeControlToggleGroup;
    @FXML private GridPane timeGrid;
    @FXML private Button resetTimeBtn;
    @FXML private Button applyTimeBtn;
    
    // 代理阻断相关组件
    @FXML private TextArea proxyDescription;
    @FXML private RadioButton proxyEnabledBtn;
    @FXML private RadioButton proxyDisabledBtn;
    @FXML private ToggleGroup proxyToggleGroup;
    @FXML private Label proxyStatusLabel;
    @FXML private ListView<String> proxyLogListView;
    @FXML private Button clearProxyLogBtn;
    @FXML private Button applyProxyBtn;
    
    // 时间控制网格数据
    private boolean[][] timeGridData = new boolean[7][24]; // 7天 x 24小时
    private Rectangle[][] timeRectangles = new Rectangle[7][24];
    
    // 代理日志数据
    private ObservableList<String> proxyLogs = FXCollections.observableArrayList();
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 初始化时间控制网格
        initTimeGrid();
        
        // 初始化代理阻断日志
        initProxyLog();
        
        // 设置时间控制状态变化监听
        timeControlToggleGroup.selectedToggleProperty().addListener((observable, oldValue, newValue) -> {
            boolean isEnabled = timeControlEnabledBtn.isSelected();
            timeGrid.setDisable(!isEnabled);
            updateTimeControlStatus(isEnabled);
        });
        
        // 设置代理阻断状态变化监听
        proxyToggleGroup.selectedToggleProperty().addListener((observable, oldValue, newValue) -> {
            boolean isEnabled = proxyEnabledBtn.isSelected();
            updateProxyStatus(isEnabled);
        });
    }
    
    /**
     * 初始化时间控制网格
     */
    private void initTimeGrid() {
        // 添加星期标签（第一列）
        String[] weekdays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
        for (int row = 0; row < 7; row++) {
            Label label = new Label(weekdays[row]);
            timeGrid.add(label, 0, row + 1);
        }
        
        // 添加小时标签（第一行）
        for (int col = 0; col < 24; col++) {
            Label label = new Label(String.format("%02d", col));
            timeGrid.add(label, col + 1, 0);
        }
        
        // 创建时间单元格
        for (int row = 0; row < 7; row++) {
            for (int col = 0; col < 24; col++) {
                Rectangle rect = new Rectangle(20, 20);
                rect.setFill(Color.WHITE); // 默认白色（禁止上网）
                rect.setStroke(Color.GRAY);
                
                // 设置单元格点击事件
                final int r = row;
                final int c = col;
                rect.setOnMouseClicked(event -> toggleTimeCell(r, c, rect));
                
                timeGrid.add(rect, col + 1, row + 1);
                timeRectangles[row][col] = rect;
                timeGridData[row][col] = false; // 默认禁止上网
            }
        }
    }
    
    /**
     * 切换时间单元格状态
     */
    private void toggleTimeCell(int row, int col, Rectangle rect) {
        timeGridData[row][col] = !timeGridData[row][col];
        updateCellColor(row, col);
    }
    
    /**
     * 更新单元格颜色
     */
    private void updateCellColor(int row, int col) {
        if (timeGridData[row][col]) {
            timeRectangles[row][col].setFill(Color.LIGHTGREEN); // 允许上网
        } else {
            timeRectangles[row][col].setFill(Color.WHITE); // 禁止上网
        }
    }
    
    /**
     * 初始化代理日志
     */
    private void initProxyLog() {
        proxyLogListView.setItems(proxyLogs);
        // 添加一些示例日志
        addProxyLog("系统启动，开始监控代理连接");
    }
    
    /**
     * 添加代理日志
     */
    private void addProxyLog(String message) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String logEntry = now.format(formatter) + " - " + message;
        proxyLogs.add(0, logEntry); // 新日志添加到顶部
    }
    
    /**
     * 更新时间控制状态
     */
    private void updateTimeControlStatus(boolean isEnabled) {
        if (isEnabled) {
            addProxyLog("时间控制功能已启用");
        } else {
            addProxyLog("时间控制功能已禁用");
        }
    }
    
    /**
     * 更新代理状态
     */
    private void updateProxyStatus(boolean isEnabled) {
        if (isEnabled) {
            proxyStatusLabel.setText("代理检测已启用，正在监控代理连接...");
            addProxyLog("代理检测功能已启用");
        } else {
            proxyStatusLabel.setText("代理检测已禁用");
            addProxyLog("代理检测功能已禁用");
        }
    }
    
    /**
     * 重置时间控制按钮点击事件
     */
    @FXML
    private void onResetTimeClicked() {
        // 重置所有时间单元格为禁止状态
        for (int row = 0; row < 7; row++) {
            for (int col = 0; col < 24; col++) {
                timeGridData[row][col] = false;
                updateCellColor(row, col);
            }
        }
        addProxyLog("时间控制设置已重置");
    }
    
    /**
     * 应用时间控制按钮点击事件
     */
    @FXML
    private void onApplyTimeClicked() {
        // 保存时间控制设置
        boolean isEnabled = timeControlEnabledBtn.isSelected();
        saveTimeControlSettings(isEnabled);
        addProxyLog("时间控制设置已应用");
        
        // 显示确认对话框
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("设置已保存");
        alert.setHeaderText(null);
        alert.setContentText("时间控制设置已成功应用");
        alert.showAndWait();
    }
    
    /**
     * 保存时间控制设置
     */
    private void saveTimeControlSettings(boolean isEnabled) {
        // 这里实现保存设置的逻辑
        // 实际项目中可能需要保存到配置文件或数据库
        System.out.println("保存时间控制设置: " + (isEnabled ? "启用" : "禁用"));
        
        // 输出时间网格数据用于调试
        for (int row = 0; row < 7; row++) {
            StringBuilder sb = new StringBuilder();
            sb.append("星期").append(row + 1).append(": ");
            for (int col = 0; col < 24; col++) {
                sb.append(timeGridData[row][col] ? "1" : "0");
            }
            System.out.println(sb.toString());
        }
    }
    
    /**
     * 清除代理日志按钮点击事件
     */
    @FXML
    private void onClearProxyLogClicked() {
        proxyLogs.clear();
        addProxyLog("日志已清除");
    }
    
    /**
     * 应用代理阻断按钮点击事件
     */
    @FXML
    private void onApplyProxyClicked() {
        // 保存代理阻断设置
        boolean isEnabled = proxyEnabledBtn.isSelected();
        saveProxySettings(isEnabled);
        
        // 显示确认对话框
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("设置已保存");
        alert.setHeaderText(null);
        alert.setContentText("代理阻断设置已成功应用");
        alert.showAndWait();
    }
    
    /**
     * 保存代理阻断设置
     */
    private void saveProxySettings(boolean isEnabled) {
        // 这里实现保存设置的逻辑
        // 实际项目中可能需要保存到配置文件或数据库
        System.out.println("保存代理阻断设置: " + (isEnabled ? "启用" : "禁用"));
        updateProxyStatus(isEnabled);
    }
}